/**
 * API相关类型定义
 */

/**
 * API响应基础接口
 */
export interface ApiResponse<T = any> {
  /**
   * 状态码
   */
  code: number
  
  /**
   * 消息
   */
  message: string
  
  /**
   * 数据
   */
  data: T
  
  /**
   * 是否成功
   */
  success: boolean
}

/**
 * 分页请求参数
 */
export interface PaginationParams {
  /**
   * 页码，从1开始
   */
  page: number
  
  /**
   * 每页数量
   */
  pageSize: number
  
  /**
   * 排序字段
   */
  sortField?: string
  
  /**
   * 排序方式：ascend(升序)、descend(降序)
   */
  sortOrder?: 'ascend' | 'descend'
}

/**
 * 分页响应数据
 */
export interface PaginationData<T = any> {
  /**
   * 列表数据
   */
  list: T[]
  
  /**
   * 总数量
   */
  total: number
  
  /**
   * 当前页码
   */
  page: number
  
  /**
   * 每页数量
   */
  pageSize: number
  
  /**
   * 总页数
   */
  totalPages: number
}

/**
 * 分页响应
 */
export type PaginationResponse<T = any> = ApiResponse<PaginationData<T>>

/**
 * 文件上传响应
 */
export interface UploadResponse {
  /**
   * 文件URL
   */
  url: string
  
  /**
   * 文件名
   */
  filename: string
  
  /**
   * 文件大小（字节）
   */
  size: number
  
  /**
   * 文件类型
   */
  mimeType: string
}

/**
 * 登录请求参数
 */
export interface LoginParams {
  /**
   * 用户名
   */
  username: string
  
  /**
   * 密码
   */
  password: string
  
  /**
   * 验证码
   */
  captcha?: string
  
  /**
   * 记住我
   */
  remember?: boolean
}

/**
 * 登录响应数据
 */
export interface LoginData {
  /**
   * 访问令牌
   */
  accessToken: string
  
  /**
   * 刷新令牌
   */
  refreshToken: string
  
  /**
   * 令牌类型
   */
  tokenType: string
  
  /**
   * 过期时间（秒）
   */
  expiresIn: number
  
  /**
   * 用户信息
   */
  userInfo: {
    /**
     * 用户ID
     */
    id: string | number
    
    /**
     * 用户名
     */
    username: string
    
    /**
     * 昵称
     */
    nickname: string
    
    /**
     * 头像
     */
    avatar: string
    
    /**
     * 角色列表
     */
    roles: string[]
    
    /**
     * 权限列表
     */
    permissions: string[]
  }
}

/**
 * 刷新令牌请求参数
 */
export interface RefreshTokenParams {
  /**
   * 刷新令牌
   */
  refreshToken: string
}

/**
 * 刷新令牌响应数据
 */
export interface RefreshTokenData {
  /**
   * 访问令牌
   */
  accessToken: string
  
  /**
   * 刷新令牌
   */
  refreshToken: string
  
  /**
   * 令牌类型
   */
  tokenType: string
  
  /**
   * 过期时间（秒）
   */
  expiresIn: number
}

/**
 * 请求方法类型
 */
export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS'

/**
 * 请求配置
 */
export interface RequestConfig {
  /**
   * 请求URL
   */
  url: string
  
  /**
   * 请求方法
   */
  method?: RequestMethod
  
  /**
   * 请求参数
   */
  params?: Record<string, any>
  
  /**
   * 请求体
   */
  data?: any
  
  /**
   * 请求头
   */
  headers?: Record<string, string>
  
  /**
   * 超时时间（毫秒）
   */
  timeout?: number
  
  /**
   * 是否携带凭证（cookies）
   */
  withCredentials?: boolean
  
  /**
   * 响应类型
   */
  responseType?: 'json' | 'text' | 'blob' | 'arraybuffer' | 'document'
  
  /**
   * 取消令牌
   */
  cancelToken?: any
  
  /**
   * 是否显示加载提示
   */
  showLoading?: boolean
  
  /**
   * 是否显示错误提示
   */
  showError?: boolean
  
  /**
   * 是否直接返回响应数据，不进行解析
   */
  returnRaw?: boolean
}